package com.example.basic.utils;

import com.example.basic.exception.ServiceException;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

public class StringUtils extends org.apache.commons.lang3.StringUtils{

	private StringUtils() {
		throw new IllegalStateException("Utility class");
	}

	/**
	 * 将传入的对象转换为字符串，当传入的对象为null时返回默认值
	 *
	 * @param obj
	 * @param str
	 * @return
	 */
	public static String safeToString(Object obj, String str) {
		String result = str;
		if (obj != null) {
			result = String.valueOf(obj);
		}
		return result;
	}

	/**
	 * 判断str1中包含str2的个数
	 *
	 * @param str1
	 * @param str2
	 * @return counter
	 */
	public static int countStr(String str1, String str2) {
		int counter = 0;
		if (str1.indexOf(str2) == -1) {
			return 0;
		} else if (str1.indexOf(str2) != -1) {
			counter++;
			countStr(str1.substring(str1.indexOf(str2) + str2.length()), str2);
			return counter;
		}
		return counter;
	}

	/**
	 * 获取str包含key的个数
	 *
	 * @param str
	 * @param key
	 * @return
	 */
	public static int getCountStr(String str, String key) {
		int count = 0;
		int index = 0;
		while ((index = str.indexOf(key, index)) != -1) {
			index = index + key.length();
			count++;
		}
		return count;
	}

	/**
	 * 字符串的压缩
	 *
	 * @param str
	 *            待压缩的字符串
	 * @return 返回压缩后的字符串
	 * @throws IOException
	 */
	public static String compress(String str) {
		if (null == str || str.length() <= 0) {
			return str;
		}
		try (// 创建一个新的 byte 数组输出流
				ByteArrayOutputStream out = new ByteArrayOutputStream();
				// 使用默认缓冲区大小创建新的输出流
				GZIPOutputStream gzip = new GZIPOutputStream(out);) {
			// 将 b.length 个字节写入此输出流
			gzip.write(str.getBytes());
			// 使用指定的 charsetName，通过解码字节将缓冲区内容转换为字符串
			return out.toString(StandardCharsets.UTF_8.name());
		} catch (Exception e) {
			return "";
		}
	}

	/**
	 * 字符串的解压
	 *
	 * @param str
	 *            对字符串解压
	 * @return 返回解压缩后的字符串
	 * @throws IOException
	 */
	public static String decompress(String str) {
		if (null == str || str.length() <= 0) {
			return str;
		}
		try (// 创建一个新的 byte 数组输出流
				ByteArrayOutputStream out = new ByteArrayOutputStream();
				// 创建一个 ByteArrayInputStream，使用 buf 作为其缓冲区数组
				ByteArrayInputStream in = new ByteArrayInputStream(str.getBytes("utf-8"));
				// 使用默认缓冲区大小创建新的输入流
				GZIPInputStream gzip = new GZIPInputStream(in);) {
			byte[] buffer = new byte[256];
			int n = 0;
			// 将未压缩数据读入字节数组
			while ((n = gzip.read(buffer)) >= 0) {
				// 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此 byte数组输出流
				out.write(buffer, 0, n);
			}
			// 使用指定的 charsetName，通过解码字节将缓冲区内容转换为字符串
			return out.toString(StandardCharsets.UTF_8.name());
		} catch (Exception e) {
			return "";
		}
	}

	/**
	 * 将string的首字母大写
	 *
	 * @param str
	 * @return
	 */
	public static String makeFirstCharUpper(String str) {
		char[] cs = str.toCharArray();
		if (cs[0] >= 97 && cs[0] <= 122) {
			cs[0] -= 32;
		}
		return String.valueOf(cs);

	}

	/**
	 * 将string的首字母小写
	 *
	 * @param str
	 * @return
	 */
	public static String makeFirstCharLower(String str) {
		char[] cs = str.toCharArray();
		if (cs[0] >= 65 && cs[0] <= 90) {
			cs[0] += 32;
		}
		return String.valueOf(cs);

	}

	public static Boolean isEffective(String str) {
		if (str == null || str.isEmpty()) {
			return false;
		}else {
			return true;
		}
	}

	public static String formatFileName(String fileName) {
		if (null == fileName || "".equals(fileName.trim())) {
			throw new ServiceException("文件名转换错误");
		}
		return fileName.replaceAll("\\/", "").replaceAll("<", "").replaceAll(">", "").replaceAll(":", "").replaceAll("\\?", "").replaceAll("|", "").replaceAll("\"", "").replaceAll("\\*", "");

	}

	/**
	 * @create 字符串全非空 wanggx_ruiyi 2020.07.17 10:43
	 * @param params 可变长的字符串
	 * @return
	 *
	 *
	 * 类似于   (a != null && !"".equals(a)) && (b != null && !"".equals(b))
	 */
	public static boolean notEmptyParams(String ... params){

		// 校验字符串个数是否合法
		if (params == null || params.length < 1) {
			throw new ServiceException("请输入正确的字符串！");
		}

		// 最终返回结果
		boolean result = false;

		for (String param : params) {
			if(param == null || "".equals(param)){
				result = false;
				break;
			}
			result = true;
		}
		return result;
	}

	/**
	 * @create 字符串全为空 wanggx_ruiyi 2020.07.17 10:43
	 * @param params 可变长的字符串
	 * @return
	 *
	 * 类似于   (a == null || "".equals(a)) && (b == null || "".equals(b))
	 */
	public static boolean emptyParams(String ... params){

		// 校验字符串个数是否合法
		if (params == null || params.length < 1) {
			throw new ServiceException("请输入正确的字符串！");
		}

		// 最终返回结果
		boolean result = false;

		for (String param : params) {
			if(param != null && !"".equals(param)){
				result = false;
				break;
			}
			result = true;
		}
		return result;
	}


	/**
	 * @create 至少有一个参数为空 wanggx_ruiyi 2020.07.17 10:43
	 * @param params 可变长的字符串
	 * @return
	 *
	 * 类似于   (a == null || "".equals(a)) || (b == null || "".equals(b))
	 */
	public static boolean partEmptyParams(String ... params){

		// 校验字符串个数是否合法
		if (params == null || params.length < 1) {
			throw new ServiceException("请输入正确的字符串！");
		}

		// 最终返回结果
		boolean result = false;

		for (String param : params) {
			if(param == null || "".equals(param)){
				result = true;
				break;
			}
		}
		return result;
	}

	/**
	 * @create 至少有一个参数不为空 wanggx_ruiyi 2020.07.17 10:43
	 * @param params 可变长的字符串
	 * @return
	 *
	 * 类似于   (a != null || !"".equals(a)) || (b != null || !"".equals(b))
	 */
	public static boolean partNotEmptyParams(String ... params){

		// 校验字符串个数是否合法
		if (params == null || params.length < 1) {
			throw new ServiceException("请输入正确的字符串！");
		}

		// 最终返回结果
		boolean result = false;

		for (String param : params) {
			if(param != null && !"".equals(param)){
				result = true;
				break;
			}
		}
		return result;
	}

	/**
	 * @create 字符串一个为空，另一个不为空（目前只支持两个参数） wanggx_ruiyi 2020.07.17 10:43
	 * @param params 可变长的字符串
	 * @return
	 *
	 * 类似于   (a != null || !"".equals(a)) && (b == null || "".equals(b))
	 */
	public static boolean oppositesExist(String ... params){

		// 校验字符串个数是否合法
		if (params == null || params.length < 2) {
			throw new ServiceException("请输入正确的字符串！");
		}

		// 最终返回结果
		boolean result = false;

		// 取出第一个参数
		String firstParam = params[0];
		// 去除第二个参数
		String twoParam = params[1];

		if((firstParam != null && !"".equals(firstParam)) && (twoParam == null || "".equals(twoParam))){
			result = true;
		}
		if((firstParam == null || "".equals(firstParam)) && (twoParam != null && !"".equals(twoParam))){
			result = true;
		}
		return result;
	}

}
